001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Feb 9, 2003 005 * Time: 5:21:17 PM 006 */ 007 008 package EVolve.visualization.XYViz.ValValViz; 009 010 import EVolve.data.*; 011 import EVolve.visualization.*; 012 import EVolve.visualization.Dimension; 013 import EVolve.visualization.VizFactory.VisualizationFactory; 014 import EVolve.util.painters.*; 015 import EVolve.util.predefinedutils.VizInfo; 016 import EVolve.Scene; 017 import EVolve.exceptions.VizInfoCreateException; 018 import EVolve.exceptions.NoDataPlotException; 019 020 import javax.swing.*; 021 import java.awt.*; 022 import java.awt.event.*; 023 import java.awt.image.BufferedImage; 024 import java.util.*; 025 026 public class EventViz extends ValueValueVisualization{ 027 private JTextField textBegin,textEnd,textBoxSize; 028 private int boxSize = 10; 029 private ArrayList menuList; 030 private JMenuItem itemReArrange, itemSelectX, itemSelectTimeFrame, selectionMenu[] = null; 031 private static int SELECT_OPTION = 0x0011; 032 private JComboBox comboPainter,comboPredictor; 033 private Painter[] painters; 034 private int selectedPainter; 035 private PredictorFactory[] factory; // predictor factories 036 private Predictor[] predictor; // predictors 037 private AutoImage entityMapImage; 038 private final int PredictionPainter = 0, RandomColorPainter = 1, DefaultPainter = 2; 039 private JLabel toEventNo; 040 041 042 public EventViz(PredictorFactory[] factory) { 043 super(); 044 menuList = new ArrayList(); 045 046 beginCall = 0; 047 endCall = 300; 048 interval = 1; 049 selectedPainter = 0; 050 painters = createPainters(); 051 this.factory = factory; 052 flipMagnifier = false; 053 } 054 055 private Painter[] createPainters() { 056 Painter[] painters = new Painter[3]; 057 painters[0] = new EventPredictionPainter(); 058 painters[1] = new RandomPainter(); 059 painters[2] = new DefaultPainter(); 060 return painters; 061 } 062 063 public void autoUpdateConfiguration(HashMap config) { 064 super.autoUpdateConfiguration(config); 065 if (config.get("Match")!=null) { 066 boxSize = (int)((Float)(config.get("Match"))).floatValue(); 067 } 068 if (config.get("Options")!=null) { 069 String painterName = (String)config.get("Options"); 070 for (int i=0; i<painters.length; i++) 071 if (painters[i].getName().equals(painterName)) { 072 selectedPainter = i; 073 break; 074 } 075 } 076 textBegin.setText(String.valueOf(beginCall)); 077 textEnd.setText(String.valueOf(endCall)); 078 textBoxSize = new JTextField(String.valueOf(boxSize)); 079 } 080 081 protected void updateConfiguration() { 082 083 if (textBegin == null) 084 textBegin = new JTextField(String.valueOf(beginCall)); 085 if (textEnd == null) 086 textEnd = new JTextField(String.valueOf(endCall)); 087 if (textBoxSize == null) 088 textBoxSize = new JTextField(String.valueOf(boxSize)); 089 090 try { 091 beginCall = Integer.parseInt(textBegin.getText()); 092 endCall = Integer.parseInt(textEnd.getText()); 093 boxSize = Integer.parseInt(textBoxSize.getText()); 094 095 super.updateConfiguration(); 096 } catch (NumberFormatException e) { 097 Scene.showErrorMessage("Begin call and end call must be an integer and smaller than "+Integer.MAX_VALUE+"."); 098 configure(); 099 }; 100 101 } 102 103 public HashMap getCurrentConfigure() { 104 try { 105 HashMap configure = super.getCurrentConfigure(); 106 107 VizInfo vizInfo = new VizInfo(); 108 vizInfo.setFactory((VisualizationFactory)configure.get("Factory")); 109 vizInfo.setSubject((ElementDefinition)configure.get("Subject")); 110 String[] dimensionDefs = new String[3]; 111 dimensionDefs[0] = xAxis.getName() ; 112 dimensionDefs[1] = entityIdFilter.getName() ; 113 dimensionDefs[2] = filter2.getName(); 114 configure.put("Dimension",vizInfo.createDimension(dimensionDefs)); 115 configure.put("Predictor",factory[comboPredictor.getSelectedIndex()]); 116 117 configure.put("Interval", new Integer(interval)); 118 configure.put("BeginCall", new Long(beginCall)); 119 configure.put("EndCall", new Long(endCall)); 120 configure.put("Match", new Float(boxSize)); 121 configure.put("Options",painters[selectedPainter].getName()); 122 123 return configure; 124 }catch (VizInfoCreateException e) { 125 Scene.showErrorMessage(e.getMessage()); 126 } 127 return null; 128 } 129 130 public Dimension[] createDimension() { 131 Dimension [] returnDimension = new Dimension[3]; 132 133 xAxis = new ValueDimension(); 134 entityIdFilter = new ReferenceDimension(); 135 filter2 = new ReferenceDimension(); 136 137 returnDimension[0] = xAxis; 138 returnDimension[1] = entityIdFilter; 139 returnDimension[2] = filter2; 140 141 return returnDimension; 142 } 143 144 protected Component createPanel() { 145 Component returnVal = super.createPanel(); 146 canvas.setPanelFlag(AxesPanel.Null); 147 canvas.setZoomingSize(50,50); 148 flipMagnifier = false; 149 addMagnifier(canvas,flipMagnifier); 150 151 return returnVal; 152 } 153 154 public void preVisualize() { 155 super.preVisualize(); 156 image = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize)); 157 entityMapImage = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize)); 158 canvas.setShapeSize(boxSize); 159 if (selectedPainter == 0) { 160 predictor = new Predictor[entityIdFilter.getMaxEntityNumber()]; 161 for (int i = 0; i < predictor.length; i++) { 162 if (comboPredictor == null) 163 predictor[i] = factory[0].createPredictor(); 164 else 165 predictor[i] = factory[comboPredictor.getSelectedIndex()].createPredictor(); 166 } 167 } 168 getSelection(); 169 installPainter(); 170 } 171 172 protected void receiveElement(Element element) { 173 if (element.isOptional()) return; 174 175 long no = xAxis.getField(element) - 1; 176 long traceId = entityIdFilter.getField(element); 177 long z = filter2.getField(element); 178 179 180 countEvents(no); 181 if ((no < beginCall)||(no > endCall)) { 182 return; 183 } 184 if (selectedPainter != RandomColorPainter) 185 painters[1].paint(entityMapImage,(no-beginCall)%(panel.getWidth()/boxSize), 186 (no-beginCall)/(panel.getWidth()/boxSize),traceId); 187 188 if (selectedPainter == PredictionPainter) {// prediction color painter 189 painter.paint(image,no-beginCall,traceId,filter2.getEntityFromInt((int)z).getId()); 190 } else { 191 painter.paint(image,(no-beginCall)%(panel.getWidth()/boxSize), 192 (no-beginCall)/(panel.getWidth()/boxSize),traceId); 193 } 194 } 195 196 public void visualize() { 197 sort(); 198 } 199 200 public void sort() { 201 try { 202 int width = panel.getWidth() - ((JScrollPane)panel).getVerticalScrollBar().getWidth(); 203 canvas.setShapeSize(boxSize); 204 ((AutoShapeImage)image).reArrange(width,boxSize); 205 if (selectedPainter != 1) ((AutoShapeImage)entityMapImage).reArrange(width,boxSize); 206 BufferedImage result = image.getImage(); 207 canvas.setImage(result); 208 canvas.setPreferredSize(new java.awt.Dimension(result.getWidth(),result.getHeight())); 209 canvas.revalidate(); 210 canvas.repaint(); 211 } catch (NoDataPlotException e) { 212 Scene.showErrorMessage(e.getMessage()); 213 } 214 } 215 216 protected void mouseMove(int x,int y) { 217 int X = canvas.getImageX(x); 218 int Y = canvas.getImageY(y); 219 AutoShapeImage aImage = (AutoShapeImage)image; 220 if (selectedPainter != 1) 221 aImage = (AutoShapeImage)entityMapImage; 222 Color color= (aImage == null) ? null : (Color)aImage.getColor(X/boxSize,Y/boxSize); 223 if (color != null) { 224 int mappedId = (int)((RandomPainter)painters[1]).getKeyFromColor(color); 225 Entity entity = entityIdFilter.getEntityFromInt(mappedId); 226 if (entity != null) { 227 Scene.setStatus(entity.getName() 228 + " " + xAxis.getDataFilter().getName()+":"+ (x/boxSize + aImage.getW() * (y/boxSize))); 229 } 230 } else { 231 Scene.setStatus(" "); 232 } 233 } 234 235 public void makeSelection() { 236 int w = image.getW(); 237 int startX = canvas.getStartX()/boxSize; 238 int endX = canvas.getEndX()/boxSize; 239 int startY = canvas.getStartY()/boxSize; 240 int endY = canvas.getEndY()/boxSize; 241 242 if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) { 243 Scene.showErrorMessage("The active data source used currently is different from \n" + 244 "this visualization, please choose \"" + 245 Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\"."); 246 return; 247 } 248 249 long start = startX+startY*w; 250 long end = endX+endY*w; 251 long eventInterval[] = findEventInterval(start+beginCall, end+beginCall); 252 start = eventInterval[0]; 253 end = eventInterval[1]; 254 255 ArrayList idList = new ArrayList(); 256 257 for (int i=startX; i<=endX; i++) { 258 for (int j=startY; j<=endY; j++) { 259 Long id = new Long(((RandomPainter)painter).getKeyFromColor((Color)image.getColor(i,j))); 260 if (!idList.contains(id)) 261 idList.add(id); 262 } 263 } 264 265 int selection[] = null; 266 if ((SELECT_OPTION & 0x00f0) == SELECT_OCCURRED_ENTITIES) { 267 selection = new int[idList.size()]; 268 for (int i=0; i<selection.length; i++) 269 selection[i] = ((Long)idList.get(i)).intValue(); 270 } else { 271 selection = new int[entityIdFilter.getEntityNumber()]; 272 for (int i=0; i<selection.length; i++) 273 selection[i] = i; 274 } 275 if ((SELECT_OPTION & 0x000f) == 0x0000) { 276 start = 0; 277 end = Long.MAX_VALUE; 278 } 279 entityIdFilter.makeSelection(subjectDefinition.getType(),selection,start,end,timeMap); 280 } 281 282 public JMenuItem[] createSelectionMenuItem() { 283 if (selectionMenu != null) return selectionMenu; 284 285 itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame"); 286 itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T); 287 itemSelectTimeFrame.addActionListener(new ActionListener() { 288 public void actionPerformed(ActionEvent e) { 289 boolean selected = itemSelectTimeFrame.isSelected(); 290 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME); 291 } 292 }); 293 itemSelectTimeFrame.setSelected(true); 294 295 itemSelectX = new JCheckBoxMenuItem("Occurred Entitiies"); 296 itemSelectX.setMnemonic(KeyEvent.VK_O); 297 itemSelectX.addActionListener(new ActionListener() { 298 public void actionPerformed(ActionEvent e) { 299 boolean selected = itemSelectX.isSelected(); 300 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_OCCURRED_ENTITIES); 301 } 302 }); 303 itemSelectX.setSelected(true); 304 305 selectionMenu = new JMenuItem[2]; 306 selectionMenu[0] = itemSelectTimeFrame; 307 selectionMenu[1] = itemSelectX; 308 309 return selectionMenu; 310 } 311 312 public int getBoxSize() { 313 return boxSize; 314 } 315 316 protected void installPainter() { 317 painters = createPainters(); 318 painter = painters[selectedPainter]; 319 if (selectedPainter == 0) 320 ((EventPredictionPainter)painter).setParameters(predictor,filter2.getDataFilter().getTargetType(),panel.getWidth()/boxSize); 321 } 322 323 protected ArrayList createOptionalMenu() { 324 if (menuList.size() > 0) return null; 325 326 menuList.clear(); 327 itemReArrange = new JMenuItem("Rearrange"); 328 itemReArrange.setMnemonic(KeyEvent.VK_R); 329 itemReArrange.addActionListener(new ActionListener() { 330 public void actionPerformed(ActionEvent e) { 331 String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(), 332 "Input new size for rectangles:", 333 "Rearrange", 334 JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(boxSize)); 335 if (newSize!=null) { 336 boxSize = Integer.parseInt(newSize); 337 if (selectedPainter != 1) 338 ((AutoShapeImage)entityMapImage).reArrange(panel.getWidth(),boxSize); 339 sort(); 340 } 341 } 342 }); 343 344 menuList.add(itemReArrange); 345 return menuList; 346 } 347 348 public Object clone() { 349 EventViz o = (EventViz)super.clone(); 350 o.dimension[0] = o.xAxis; 351 o.dimension[1] = o.entityIdFilter; 352 o.dimension[2] = o.filter2; 353 o.createDialog(); 354 o.createMenu(); 355 o.menuList = new ArrayList(); 356 o.updateMenu(); 357 o.painters = new Painter[3]; 358 for (int i=0; i<o.painters.length; i++) 359 o.painters[i] = (Painter)painters[i].clone(); 360 o.entityMapImage = (AutoShapeImage)entityMapImage.clone(); 361 362 return o; 363 } 364 365 /** 366 * customize UI 367 */ 368 protected void createDialog() { 369 dialog = new JDialog(Scene.getFrame(), "Configure", true); 370 371 JPanel panelTitle = new JPanel(new FlowLayout()); 372 dialog.getContentPane().add(panelTitle, BorderLayout.NORTH); 373 374 panelTitle.add(new JLabel("Title: ")); 375 376 textName = new JTextField(name, 12); 377 panelTitle.add(textName); 378 379 JPanel panelMain = new JPanel(new BorderLayout()); 380 panelMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose subject & dimensions")); 381 dialog.getContentPane().add(panelMain, BorderLayout.CENTER); 382 383 JPanel panelName = new JPanel(new GridLayout(definition.getDimensionDefinition().length , 1, 5, 5)); 384 panelMain.add(panelName, BorderLayout.WEST); 385 386 panelName.add(new JLabel(" Subject: ")); 387 for (int i = 0; i < definition.getDimensionDefinition().length - 1; i++) { 388 panelName.add(new JLabel(" " + definition.getDimensionDefinition()[i].getName() + ": ")); 389 } 390 391 JPanel panelCombo = new JPanel(new GridLayout(definition.getDimensionDefinition().length, 1, 5, 5)); 392 panelMain.add(panelCombo, BorderLayout.CENTER); 393 394 comboSubject = new JComboBox(); 395 for (int i = 0; i < elementDefinition.length; i++) { 396 comboSubject.addItem(elementDefinition[i].getName()); 397 } 398 comboSubject.addActionListener(new ActionListener() { 399 public void actionPerformed(ActionEvent e) { 400 updateComboSubject(); 401 } 402 }); 403 panelCombo.add(comboSubject); 404 405 comboDimension = new JComboBox[definition.getDimensionDefinition().length]; 406 for (int i = 0; i < comboDimension.length; i++) { 407 comboDimension[i] = new JComboBox(); 408 comboDimension[i].addActionListener(new ActionListener() { 409 public void actionPerformed(ActionEvent e) { 410 updateComboDimension(); 411 } 412 }); 413 } 414 for (int i = 0; i < comboDimension.length - 1; i++) 415 panelCombo.add(comboDimension[i]); 416 417 JPanel returnVal = new JPanel(new GridLayout(1, 1, 5, 5)); 418 JPanel panelEvent = new JPanel(new GridLayout(6,2)); 419 420 Box panelBottom = new Box(BoxLayout.Y_AXIS); 421 returnVal.add(panelBottom); 422 423 comboPredictor = new JComboBox(); 424 for (int i = 0; i < factory.length; i++) { 425 comboPredictor.addItem(factory[i].getName()); 426 } 427 428 comboPainter = new JComboBox(); 429 for (int i = 0; i < painters.length; i++) { 430 comboPainter.addItem(painters[i].getName()); 431 } 432 comboPainter.addActionListener(new ActionListener() { 433 public void actionPerformed(ActionEvent e) { 434 selectedPainter = comboPainter.getSelectedIndex(); 435 if (selectedPainter == 0) { 436 comboPredictor.setEnabled(true); 437 comboDimension[comboDimension.length-1].setEnabled(true); 438 } else { 439 comboPredictor.setEnabled(false); 440 comboDimension[comboDimension.length-1].setEnabled(false); 441 } 442 } 443 }); 444 comboPainter.setSelectedIndex(selectedPainter); 445 446 panelEvent.add(new JLabel("Painter used: ")); 447 panelEvent.add(comboPainter); 448 panelEvent.add(new JLabel(definition.getDimensionDefinition()[comboDimension.length -1].getName() + ": ")); 449 panelEvent.add(comboDimension[comboDimension.length -1]); 450 panelEvent.add(new JLabel("Predictor: ")); 451 panelEvent.add(comboPredictor); 452 panelEvent.add(new JLabel("From Event No:")); 453 panelEvent.add(textBegin); 454 455 String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName())); 456 toEventNo = new JLabel("To Event No:("+range+")"); 457 panelEvent.add(toEventNo); 458 panelEvent.add(textEnd); 459 panelEvent.add(new JLabel("Box Size:")); 460 panelEvent.add(textBoxSize); 461 462 panelBottom.add(panelEvent); 463 464 updateComboSubject(); 465 466 panelMain.add(returnVal, BorderLayout.SOUTH); 467 468 JPanel panelButton = new JPanel(new FlowLayout()); 469 dialog.getContentPane().add(panelButton, BorderLayout.SOUTH); 470 471 JButton buttonApply = new JButton("Apply"); 472 buttonApply.addActionListener(new ActionListener() { 473 public void actionPerformed(ActionEvent e) { 474 dialogApply(); 475 } 476 }); 477 panelButton.add(buttonApply); 478 479 JButton buttonCancel = new JButton("Cancel"); 480 buttonCancel.addActionListener(new ActionListener() { 481 public void actionPerformed(ActionEvent e) { 482 dialogCancel(); 483 } 484 }); 485 panelButton.add(buttonCancel); 486 487 //************* 488 for (int i=0; i<comboSubject.getItemCount(); i++) { 489 if ((comboSubject.getItemAt(i)).equals(subjectDefinition.getName())) { 490 comboSubject.setSelectedIndex(i); 491 break; 492 } 493 } 494 for (int i=0;i<comboDimension.length;i++) { 495 for (int j =0 ; j<comboDimension[i].getItemCount();j++) { 496 if (comboDimension[i].getItemAt(j).equals(dimension[i].getDataFilter().getName())) { 497 comboDimension[i].setSelectedIndex(j); 498 break; 499 } 500 } 501 } 502 } 503 504 protected void updateComboSubject() { 505 super.updateComboSubject(); 506 String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName())); 507 toEventNo.setText("To Event No:("+range+")"); 508 } 509 510 }